#ifndef HAL_DEVICE_H
#define HAL_DEVICE_H

#include "hal_type.h"
#include "hal_config.h"
#include "hal_error.h"

_class _hal_device;
typedef _class _hal_device hal_device;

_class _hal_device{

    /**
     * @brief name 设备名
     */
    uint8_t name[HAL_DEVICE_NAME_MAX_LEN];

    /**
     * @brief type 设备类型
     */
    device_type type;

    /**
     * @brief status 设备状态
     */
    device_status status;
    /**
     * @brief 设备初始化
     */
    uint32_t (*init)(hal_device* dev);
    /**
     * @brief 设备打开
     */
    uint32_t (*open)(hal_device* dev, uint8_t flg);
    /**
     * @brief 设备关闭
     */
    uint32_t (*close)(hal_device* dev);
    /**
     * @brief 设备开始
     */
    uint32_t (*start)(hal_device *dev, uint16_t flag);
    /**
     * @brief 设备关闭
     */
    uint32_t (*stop)(hal_device *dev);
    /**
     * @brief 设备写
     */
    uint32_t (*write)(hal_device *dev, uint32_t opt, uint8_t* buf, uint32_t len);
    /**
     * @brief 设备读
     */
    uint32_t (*read)(hal_device* dev, uint32_t opt, uint8_t* buf, uint32_t len);
    
};



extern uint32_t hal_device_set_name(hal_device* dev, const int8_t* name);

extern uint8_t* hal_device_get_name(hal_device* dev);

/**
 * @brief hal_device_find 根据设备名，查找设备集的设备并返回句柄
 * @param name 设备名
 * @return 返回设备的设备句柄，NULL表示无设备
 */
extern hal_device* hal_device_find(const int8_t* name);

/**
 * @brief hal_device_register 设备注册
 * @param dev 需要注册的设备指针
 * @param name 需要注册的设备名
 * @return 设备是否注册成功
 */
extern uint32_t hal_device_register(hal_device* dev, const int8_t* name);

/**
 * @brief uint32_hal_device_init 设备初始化
 * @param dev 需要初始化设备句柄
 * @return 设备是否初始化成功
 */
extern uint32_t hal_device_init(hal_device* dev);

/**
 * @brief hal_device_open 打开设备
 * @param dev 需要打开的设备句柄
 * @param flg 打开设备的标志
 * @return 设备是否打开成功
 */
extern uint32_t hal_device_open(hal_device* dev, uint16_t flg);


/**
 * @brief hal_device_close 关闭设备
 * @param dev 需要关闭的设备句柄
 * @return 设备是否关闭成功
 */
extern uint32_t hal_device_close(hal_device* dev);


/**
 * @brief hal_device_start 开始设备
 * @param dev 需要开始的设备句柄
 * @param flg 开始设备标志
 * @return 设备是否开始成功
 */
extern uint32_t hal_device_start(hal_device* dev, uint16_t flg);

/**
 * @brief hal_device_stop 停止设备
 * @param dev 需要停止的设备句柄
 * @return 设备是否停止成功
 */
extern uint32_t hal_device_stop(hal_device* dev);


/**
 * @brief hal_device_write 设备写操作
 * @param dev 设备写操作句柄
 * @param opt 设备写操作模式
 * @param buf 写数据操作指针
 * @param len 写数据长度
 * @return 设备是否写数据成功
 */
extern uint32_t hal_device_write(hal_device* dev, uint32_t opt, uint8_t* buf, uint32_t len);

/**
 * @brief hal_device_read 读设备
 * @param dev 需要读设备句柄
 * @param opt 设备读操作模式
 * @param buf 读数据指针
 * @param len 读写数据长度
 * @return 设备是否读成功
 */
extern uint32_t hal_device_read(hal_device* dev, uint32_t opt, uint8_t* buf, uint32_t len);

#endif // HAL_DEVICE_H
